package com.zerotwo;


import com.zerotwo.pojo.Apple;

import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author 02
 * &#064;date  2024/4/22-13:45
 * @version 1.0
 * &#064;description
 */
public class Main {
    static List<Apple> appleStore = new ArrayList<>();
    static {
        appleStore.add(new Apple(1,"red",100,"湖南"));
        appleStore.add(new Apple(2,"green",200,"湖南"));
        appleStore.add(new Apple(3,"red",300,"湖南"));
        appleStore.add(new Apple(4,"green",400,"天津"));
        appleStore.add(new Apple(5,"red",500,"天津"));
    }

    public static void test3() {
//        Apple apple = null;
//        Apple apple1 = Optional.ofNullable(apple) // 空指针异常
//                .orElse(new Apple(1,"red",100,"湖南"));
//        System.out.println("apple1 = " + apple1);

        // 1、遍历appleStore中的每个苹果
//        appleStore.stream().forEach(a -> System.out.println("a = " + a));

        // 2、判断appleStore中是否存在至少一个红色的苹果
//        boolean match = appleStore.stream().anyMatch(a -> a.getColor().equals("red"));
//        System.out.println("match = " + match);

        // 3、找到appleStore中最重的苹果
//        Optional<Apple> max = appleStore.stream().max(Comparator.comparingInt(Apple::getWeight));
//        System.out.println("max = " + max);

        // 4、找到appleStore中最轻的苹果
//        Optional<Apple> min = appleStore.stream().min((a, b) -> a.getWeight() - b.getWeight());
//        System.out.println(min.get());

        // 5、统计appleStore中以湖开头的苹果的数量
//        long count = appleStore.stream().filter(a -> a.getOrigin().startsWith("湖")).count();
//        System.out.println("count = " + count);

        // 6、获取appleStore中所有苹果的产地
//        Stream<String> stringStream = appleStore.stream().map(Apple::getOrigin);
//        Stream<String> stringStream = appleStore.stream().map(a -> a.getOrigin()).distinct(); //去重
//        stringStream.forEach(System.out::println);

        // 7、将appleStore中的每个苹果转换为一个键值对，其中键为苹果的ID，值为苹果对象
//        Map<Integer, Apple> collect = appleStore.stream().collect(Collectors.toMap(Apple::getId, a -> a));
//        collect.entrySet().forEach(System.out::println);
//        System.out.println("collect = " + collect);

        // 8、将appleStore中的每个苹果按照颜色进行分组，并打印出每个颜色的苹果列表
//        Map<String, List<Apple>> collect =
//                appleStore.stream()
//                        .collect(Collectors.groupingBy(Apple::getColor));
//        collect.entrySet().forEach(System.out::println);
//        collect.forEach((k,v) -> System.out.println("k = " + k + " v = " + v)); //forEach

        // 9、 遍历appleStore中的每个苹果，将重量增加100克，并打印出新重量的苹果信息
//        appleStore.stream().map(a -> {
//            a.setWeight(a.getWeight()+100);
//            return a;
//        }).collect(Collectors.toList()) //toList
//                .forEach(System.out::println);

//        appleStore.stream().map(a -> {
//                    a.setWeight(a.getWeight()+100);
//                    return a;
//                }).collect(Collectors.toSet()) //toSet 去重
//                .forEach(System.out::println);

        

    }

    public static void main(String[] args) {
        test3();
//        test1();
//        test2(a -> a.getColor().equals("red"));
//        test2(a -> a.getColor().equals("red")&&a.getWeight()>200)); --多条件


        // 遍历筛选后的红色苹果列表，并打印每个苹果的信息
//        for (Apple redApple : test2(a -> a.getColor().equals("red")&&a.getWeight()>200)) {
//            System.out.println(redApple.toString());
//        }
    }

    /**
     * 测试方法：筛选出颜色为红色且重量大于200克的苹果，并打印出它们的信息。
     * 该方法不接受参数，也不返回任何值。
     */
    private static List<Apple> test1() {
        return appleStore.stream() // 从appleStore中开始创建一个流
                .filter(a -> a.getColor().equals("red")) // 筛选颜色为红色的苹果
                .filter(a -> a.getWeight()>200) // 筛选重量大于200克的苹果
                .collect(Collectors.toList()); // 收集符合条件的苹果到一个List中
    }

    /**
     * 根据指定的筛选条件过滤appleStore中的苹果，并返回过滤后的苹果列表。
     *
     * @param col 一个谓词，用于筛选符合条件的苹果。该谓词的参数类型应为Apple或其超类。
     * @return 返回一个包含所有符合条件的苹果的List。
     */
    private static List<Apple> test2(Predicate<? super Apple> col) {
             return appleStore.stream() // 将appleStore转换成一个流
                     .filter(col) // 使用提供的筛选条件过滤流中的元素
                     .collect(Collectors.toList()); // 将过滤后的元素收集到一个新的List中并返回

    }


}
